//1.求n的阶乘
//2.求1!+2!+3!.....+10!
//3.在一个有序数组中查找具体的某个数字的下标n
//4.编写代码，演示多个字符从两端，向中间汇聚\
//5.模拟输入密码，最多输入三次
#include <stdio.h>

//1.求n的阶乘
/*
int main()
{
	int n = 0;
	
	int i = 0;
	int j = 1;
	scanf("%d",&n);
	for(i=1; i<=n; i++)
	{
		j=j*i;
	}
	printf("%d\n",j);
}
*/
/*
//2.求1!+2!+3!.....+10!
int main()
{
	//方法一
	int temp = 0;
	int n = 0;	
	int i = 0;
	for(n=1; n<=10; n++)
	{
		int j = 1;
		for(i=1; i<=n; i++)
		{
			j=j*i;
		}
		temp += j;
	}

	//方法2
	for(n=1; n<=10; n++)
	{	
		j = j * n;
		temp += j;
	}

	printf("%d\n",temp);
}
*/

//3.在一个有序数组中查找具体的某个数字的下标n
/*
//方法一
int find(int n,const int* j,int i)
{
	
	int left = 0;
	int right = i;
	if(n < 0 || n > i)
	{
		printf("查找错误，程序退出\n");
		return 0;
	}
	while(left<=right)								//奇数下标会导致相等，偶数下标则正好整除，所以不可能大于
	{
		//int mid = (left+right)/2;					//当这两个数过大相加时，有可能会溢出
		int mid = left+(right-left)/2;				//所以使用该方法：当大的和小的相等，大的多出来的部分除2加上大的或小的就是平均值，可缓解溢出可能性
		if(j[mid] < n)								//可以看作两个柱子，分成等大份，大柱子与小柱子持平，多出来的部分分为2份，分给两个柱子
		{
			left = mid+1;
		}
		else if(j[mid] > n)
		{
			right = mid-1;
		}
		else
		{
			printf("下标是%d\n",mid);
			break;
		}
	}
	//j[0]=2;										//再形参里 对数组加上const就不会被更改
	//printf("%d\n",j[0]);							//防止指针/数组被更改
	return 0;
}
//方法二
int find2(int n,const int j[])
{
	int left = 0;
	int right = 9;
	int mid = 0;
	while(j[mid] != n)
	{
		mid = left+(right-left)/2;
		if(j[mid] < n)
		{
			left = mid+1;
		}
		else if(j[mid] > n)
		{
			right = mid-1;
		}
	}

	return j[n];
}
#include <string.h>
int main()
{
	//二分查找
	int i[] = {1,2,3,4,5,6,7,8,9,10};
	printf("该数字的下标为：%d\n",find2(9,i));
	find(1,i,strlen(i));

	return 0;
}
*/

/*
//4.编写代码，演示多个字符从两端，向中间汇聚
//welcom to bit ！！！
//###################
//w#################！
//we###############!！
//wel#############!!!
//....
//welcom to bit ！！！
#include <string.h>
#include <Windows.h>
#include <stdlib.h>
int main()
{
	char ch1[] = {"welcom to bit!!!!!!"};
	char ch2[] = {"###################"};
	
	int left = 0;
	//int right = sizeof(ch1)/sizeof(ch1[0])-2;		//-2是因为 sizeof会把结束符也算作在里，且数组下标比元素差1，所以-2
	int right = strlen(ch1) - 1;					
	while(left <= right)
	{
		ch2[left] = ch1[left];
		ch2[right] = ch1[right];
		printf("%s\n",ch2);
		Sleep(1000);								//只能在windows下运行，单位ms
		system("cls");								//system函数是用来执行系统名令的，cls是清屏命令
		left+=1;//left++
		right-=1;//right--
	}
	printf("%s\n",ch2);
	return 0;
}
*/

/*
//5.模拟输入密码，最多输入三次
#include <string.h>
int main()
{
	int i;
	char password[20] ={0};
	for(i=0; i<3; i++)
	{
		printf("请输入密码:\n");
		scanf("%s",password);
		if(strcmp(password,"你好") == 0)
		{
			printf("输入正确\n");
			break;
		}
		else
			printf("输入错误，重新输入\n");
		if(2==i)
		{
			printf("密码输入错误3次，程序退出");
		}
	}
	return 0;
}
*/
